package JZ_Offer.algorithm.模拟;

/**
 * 把字符串转换成整数
 *
 * 将一个字符串转换成一个整数，要求不能使用字符串转换整数的库函数。 数值为0或者字符串不是一个合法的数值则返回0
 * 输入一个字符串,包括数字字母符号,可以为空
 * 如果是合法的数值表达则返回该数字，否则返回0
 */
public class JZ67_把字符串转换成整数 {
    private static final char positive = '+';
    private static final char negative = '-';

    // 利用api
    private static int StrToInt(String str) {
        if (str == null || "".equals(str)) {
            return 0;
        }

        Integer integer = 0;
        try {
            integer = Integer.valueOf(str);
        } catch (NumberFormatException e) {
            return 0;
        }
        return integer;
    }

    // 1和2 利用ascii码 能和数字互相转换的原理
    private static int StrToInt1(String str) {
        if (str == null || "".equals(str)) {
            return 0;
        }
        int isNegative = 1;
        int value = 0;
        int i = 0;

        char[] chars = str.toCharArray();
        if (chars[0] < '0') {
            if (chars[0] == '-') {
                isNegative = -1;
            } else if (chars[0] != '+') {
                return 0;
            }
            i = 1;
        }

        for (; i < chars.length; i++) {
            int cur = chars[i] - '0';
            if (cur > 9 || cur < 0) {
                return 0;
            }

            if (isNegative == 1 && (value > Integer.MAX_VALUE / 10 || (value == Integer.MAX_VALUE / 10 && cur > 7))) {
                return 0;
            } else if (isNegative == -1 && (value < Integer.MIN_VALUE / 10 || (value == Integer.MIN_VALUE / 10 && cur > 8))) {
                return 0;
            }
            value = value * 10 + cur * isNegative;
        }

        return value;
    }

    // 和上个一样 不过在结果的累加上面 一直采用正数和上面正负分开不同
    // 为什么输入 -2147483648 不会溢出 2147483647 呢？因为 2147483647+1 = -2147483648 十分巧妙
    private static int StrToInt2(String str) {
        if (str == null || "".equals(str.trim())) return 0;

        int i = 0;
        int flag = 1;
        int res = 0;

        char[] arr = str.toCharArray();
        if (arr[i] == '-') {
            flag = -1;
        }
        if (arr[i] == '+' || arr[i] == '-') {
            i++;
        }

        while (i < arr.length) {
            //是数字
            if (arr[i] < '0' || arr[i] > '9') {
                return 0;
            }
            int cur = arr[i] - '0';
            if (flag == 1 && (res > Integer.MAX_VALUE / 10 || res == Integer.MAX_VALUE / 10 && cur > 7)) {
                return 0;
            }
            if (flag == -1 && (res > Integer.MAX_VALUE / 10 || res == Integer.MAX_VALUE / 10 && cur > 8)) {
                return 0;
            }
            res = res * 10 + cur;
            i++;
        }
        return res * flag;
    }

    public static void main(String[] args) {
        String str = "2147483647";
        int i = StrToInt1(str);
        System.out.println(i);
    }
}
